using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.AIT.AccesoDatos.Entidades;
using Boa.AIT.AccesoDatos.Contratos;
using Boa.AIT.Negocios.Servicios;
using Boa.AIT.Negocios.Excepciones;

namespace Boa.AIT.Negocios
{
   /// <summary>
   /// Implementacion de la interface IAIT_AsignarEquipoAlmacenNegociosServicio, los metodos que estan definidos en el contrato IAIT_AsignarEquipoAlmacenNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class AIT_AsignarEquipoAlmacenNegocios : IAIT_AsignarEquipoAlmacenNegociosServicio
   {
	private IAIT_AsignarEquipoAlmacenAccesoDatos accesoDatos;
	public AIT_AsignarEquipoAlmacenNegocios()
	{		
		accesoDatos = DataFactory.Current.GetAIT_AsignarEquipoAlmacenAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de AIT_AsignarEquipoAlmacen's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<AIT_AsignarEquipoAlmacen> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad AIT_AsignarEquipoAlmacen, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(AIT_AsignarEquipoAlmacen entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new AIT_AsignarEquipoAlmacenEliminarExcepcion("AIT_AsignarEquipoAlmacen");
		}
	}
	
	/// <summary>
    /// Devuelve AIT_AsignarEquipoAlmacen, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public AIT_AsignarEquipoAlmacen ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<AIT_AsignarEquipoAlmacen>, de todas la entidades de ese tipo
    /// </summary>	
	public List<AIT_AsignarEquipoAlmacen> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda AIT_AsignarEquipoAlmacen, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public AIT_AsignarEquipoAlmacen Guardar(AIT_AsignarEquipoAlmacen entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new AIT_AsignarEquipoAlmacenRequeridoExcepcion(); 
		
		#region Foreign Keys Values
                if(entidad.AlmacenEmpresaId_FK > 0 && entidad.AlmacenEmpresa==null)
                    entidad.AlmacenEmpresa = DataFactory.Current.GetAIT_AlmacenEmpresaAccesoDatos().GetById(entidad.AlmacenEmpresaId_FK);
                if(entidad.EquipoId_FK > 0 && entidad.Equipo==null)
                    entidad.Equipo = DataFactory.Current.GetAIT_EquipoITAccesoDatos().GetById(entidad.EquipoId_FK);
                if(entidad.SolicitudEquipoId_FK > 0 && entidad.SolicitudEquipo==null)
                    entidad.SolicitudEquipo = DataFactory.Current.GetAIT_SolicitudEquipoAccesoDatos().GetById(entidad.SolicitudEquipoId_FK);
                if(entidad.TipoConfiguracionId_FK > 0 && entidad.TipoConfiguracion==null)
                    entidad.TipoConfiguracion = DataFactory.Current.GetAIT_TipoConfiguracionAccesoDatos().GetById(entidad.TipoConfiguracionId_FK);
                #endregion


                if (entidad.Id == 0)
                {

                    entidad.FechaAsignacion = DateTime.Now;
                    accesoDatos.Insert(entidad);
                }
                else
                    accesoDatos.Update(entidad);

		return entidad;
	}

	#endregion

    public List<AIT_AsignarEquipoAlmacen> ListarAsignadosAlmacen(int almacenId)
    {
        List<AIT_AsignarEquipoAlmacen> lista = accesoDatos.ListarAsignadosAlmacen(almacenId).ToList();
        SincronizarEmpleadosAsignadosAEquipos(lista); 
        return lista;
    }


    internal void SincronizarEmpleadosAsignadosAEquipos(List<AIT_AsignarEquipoAlmacen> lista)
    {
        IAIT_AsignaEmpleadoAccesoDatos asignaEmpleadoData = DataFactory.Current.GetAIT_AsignaEmpleadoAccesoDatos();
        IDtoBOAPersonal boaPersonalData = DataFactory.Current.GetBOAPersonalAccesoDatos();
        foreach (var item in lista)
        {
            AIT_AsignaEmpleado empleado = asignaEmpleadoData.GetPorAsignacionEquipoAlmacen(item.Id);
            if (empleado != null)
                item.EmpleadoNombre = boaPersonalData.BuscarPorId(empleado.EmpleadoId).ToString();
        }
    
    }

    /// <summary>
    /// devuelve lista de equipos asignados al almacen y que aun no han sido asignados a algun empleado
    /// </summary>
    /// <param name="ciudadId"></param>
    /// <returns></returns>
    public List<AIT_AsignarEquipoAlmacen> ListarAsignadosAlmacenSinEmpleado(int ciudadId)
    {
        AIT_AlmacenEmpresa almacen = DataFactory.Current.GetAIT_AlmacenEmpresaAccesoDatos().GetAll().Where(p => p.Region.Id == ciudadId).FirstOrDefault();
        if (almacen == null)
        {
            throw new Exception("Registre el almacen donde trabaja el empleado seleccionado, y asigne equipos");
        }
        
        return ListarAsignadosAlmacen(almacen.Id).Where(p => string.IsNullOrEmpty(p.EmpleadoNombre)).ToList();

    
    }



    public List<AIT_AsignarEquipoAlmacen> LeerDesdeArchivoExcel(char SeparadorCodigosArchivo, List<string> codigos)
    {
        List<AIT_AsignarEquipoAlmacen> listaEquipos = new List<AIT_AsignarEquipoAlmacen>();
        foreach (var codigo in codigos)
        {
            string[] separado = codigo.Split(SeparadorCodigosArchivo);
            int valor = Convert.ToInt32(separado[0]);
            listaEquipos.Add(ObtenerTodas().Where(p => p.Equipo.Id == valor).FirstOrDefault());
        }
        //if(listaEquipos.Where(p=> p != null).Any())
        SincronizarEmpleadosAsignadosAEquipos(listaEquipos);
        return listaEquipos;

    }
   }
}


